package com.bwei.pojo;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * @author 王东辉
 * @version 1.0
 * @description: TODO
 * @date 2024/11/20 19:11
 */
public class Test {
    public static void main(String[] args) {
//        1.创建订单模型类（Order）（10分）
//¢定义一个Order类，包含id（订单编号）、customerId（客户编号）、items（订单项列表）、status（订单状态）等属性。
//¢实现必要的getter和setter	。
//2.创建订单项模型类（OrderItem）（10分）
//¢定义一个OrderItem类，包含productId（产品编号）、quantity（数量）、price（单价）等属性。
//¢实现必要的getter和setter方法。
//3.创建订单列表（10分）
//¢创建一个包含多个Order实例的List<Order>。
//¢每个Order应至少包含两个OrderItem。
        List<OrderItem> list = Arrays.asList(
                new OrderItem(1, 1001, 10, 12.1),
                new OrderItem(2, 2001, 10, 12.2),
                new OrderItem(3, 3001, 10, 12.3),
                new OrderItem(4, 4001, 10, 12.4)
        );
        Order order1 = new Order(1, 101, list, 1);
        order1.setItems(list);

           List<OrderItem> list2 = Arrays.asList(
                new OrderItem(5, 5001, 10, 12.5),
                new OrderItem(6, 6001, 10, 12.6),
                new OrderItem(7, 7001, 10, 12.7),
                new OrderItem(8, 8001, 10, 12.8)
        );
        Order order2 = new Order(2, 102, list2, 2);
        order2.setItems(list2);

        ArrayList<Order> arrayList = new ArrayList<>();
        arrayList.add(order1);
        arrayList.add(order2);
        System.out.println(arrayList);
//4.筛选已完成的订单（10分）
//¢使用Stream API从订单列表中筛选出状态为“已完成”的订单。

        System.out.println("筛选已完成的订单");
        arrayList.stream().filter(order -> order.getStatus()==2).forEach(System.out::println);
//5.计算某个客户的订单总额（10分）
//¢给定一个customerId，计算该客户所有订单的总价（即所有OrderItem的价格乘以数量之和）。
        arrayList.stream().filter(order -> order.getCustomerId()==102).forEach(System.out::println);
        System.out.println("  总价  "+arrayList.stream().filter(order -> order.getCustomerId()==102).mapToDouble(order -> order.getItems().stream().mapToDouble(orderItem -> orderItem.getPrice()*orderItem.getQuantity()).sum()).sum());
//6.统计每个产品的订单数量（10分）
//¢统计每个产品被订购的次数，并返回一个Map<ProductId, Integer>。
        System.out.println("统计每个产品的订单数量");
        arrayList.stream().flatMap(order -> order.getItems().stream()).collect(java.util.stream.Collectors.groupingBy(OrderItem::getProductId,java.util.stream.Collectors.summingInt(OrderItem::getQuantity))).forEach((k,v)-> System.out.println(k+"  "+v));

//7.找到总价最高的订单（10分）
//¢使用Stream API找到总价最高的订单，并返回该订单。
//8.按照订单总价排序（10分）
//¢将订单列表按照总价从高到低排序。
//9.过滤特定价格范围的产品（10分）
//¢过滤出所有单价在特定区间（如50元至100元之间）内的产品，并返回这些产品的ProductId。
//10.统计订单状态分布（10分）
//¢统计订单的不同状态的数量，并返回一个Map<Status, Long>。
//
//注意事项
//每个步骤都应该使用Java 8 Stream API的功能来实现。
//注意代码的可读性和可维护性。
//请确保所有功能都能正确运行，并且没有编译错误。
    }
}
